#ifndef COREINI_H
#define COREINI_H

/***************************************************************
	Класс для работы с .ini файлами
	Авторы: ...
	Дата: 12.02.2010г
***************************************************************/

#include <QtCore/qglobal.h>
#include <QObject>

#include <map>

using std::map;

class Q_DECL_EXPORT CoreIni : public QObject {
	Q_OBJECT

public:
	/**
		Конструктор класса
		 parent - родитель
		 name - имя объекта
	*/
    CoreIni(QObject* parent = 0, QString name = "");
    /**
    	Деструктор класса
    */
	~CoreIni();

private:
	//массив параметров секции <имя параметра, значение параметра>
	typedef map<QString, QString> PARAM;
	//массив секций в файле <имя секции, массив параметров>
	typedef map<QString, PARAM> SECTION;
	//массив файлов <имя файла, массив секций>
	typedef map<QString, SECTION> FILES;
	//экземпляр типа массив файлов	
	FILES files;

public slots:
	/**
		Открытие ini файла и загрузки содержимого файла во внутренний массив.
		 file (входной параметр) - полный или относительный путь к ini файлу;
		 res (выходной параметр) - результат открытия файла.
	*/
	void Load(const QString& file, int& res);
	void Load(const QString& file, bool& res);
	void Load(const QString& file);

	/**
		Сохранение данных в ini файл из внутреннего массива.
		 file (входной параметр) - полный или относительный путь к ini файлу;
		 res (выходной параметр) - результат сохранения файла.
	*/
	void Save(const QString& file, int& res);
	void Save(const QString& file, bool& res);
	void Save(const QString& file);

	/**
		Сохранение всех ранее открытых ini файлов.
		 res (выходной параметр) - результат сохранения файла.
	*/
	void SaveAll(int& res);
	void SaveAll(bool& res);
	void SaveAll();

	/**
		Закрытие ini файла.
		 file (входной параметр) - полный или относительный путь к ini файлу;
		 res (выходной параметр) - результат закрытия файла.
	*/
	void Unload(const QString& file, int& res);
	void Unload(const QString& file, bool& res);
	void Unload(const QString& file);

	/**
		Закрытие всех ранее открытых ini файлов.
		 res (выходной параметр) - результат закрытия файла.
	*/
	void UnloadAll(int& res);
	void UnloadAll(bool& res);
	void UnloadAll();

	/**
		Запрос списка загруженных ini файлов.
		 filelist(выходной параметр) - список открытых ini файлов.
	*/
	void GetFileList(QStringList& filelist);

	/**
		Проверка открытия файла.
		 file (входной параметр) - полный или относительный путь к ini файлу;
		 res (выходной параметр) - результат проверки файла.
	*/
	void isOpen(const QString& file, int& res);
	void isOpen(const QString& file, bool& res);

	/**
		Запрос списка секций.
		 file (входной параметр) - полный или относительный путь к ini файлу;
		 seclist(выходной параметр) - список секций в ini файле;
		 res (выходной параметр) - результат запроса.
	*/
	void GetSectionList(const QString& file, QStringList& seclist, int& res);
	void GetSectionList(const QString& file, QStringList& seclist, bool& res);
	void GetSectionList(const QString& file, QStringList& seclist);

	/**
		Переименование секции.
		 file (входной параметр) - полный или относительный путь к ini файлу;
		 sec (входной параметр) - имя секции;
		 newsec (входной параметр) - новое имя секции;
		 res (выходной параметр) - результат переименования секции.
	*/
	void RenameSection(const QString& file, const QString& sec, const QString& newsec, int& res);
	void RenameSection(const QString& file, const QString& sec, const QString& newsec, bool& res);
	void RenameSection(const QString& file, const QString& sec, const QString& newsec);

	/**
		Копирование секции.
		 file (входной параметр) - полный или относительный путь к ini файлу;
		 sec (входной параметр) - имя секции;
		 newsec (входной параметр) - имя новой секции;
		 res (выходной параметр) - результат копирования секции.
	*/
	void CopySection(const QString& file, const QString& sec, const QString& newsec, int& res);
	void CopySection(const QString& file, const QString& sec, const QString& newsec, bool& res);
	void CopySection(const QString& file, const QString& sec, const QString& newsec);

	/**
		Удаление секции.
		 file (входной параметр) - полный или относительный путь к ini файлу;
		 sec (входной параметр) - имя секции;
		 newsec (входной параметр) - имя новой секции;
		 res (выходной параметр) - результат копирования секции.
	*/
	void DelSection(const QString& file, const QString& sec, int& res);
	void DelSection(const QString& file, const QString& sec, bool& res);
	void DelSection(const QString& file, const QString& sec);

	/**
		Запрос списка параметров в секции.
		 file (входной параметр) - полный или относительный путь к ini файлу;
		 sec(входной параметр) - имя секции;
		 parlist(выходной параметр) - список параметров в секции;
		 res (выходной параметр) - результат запроса.
	*/
	void GetParamList(const QString& file, const QString& sec, QStringList& parlist, int& res);
	void GetParamList(const QString& file, const QString& sec, QStringList& parlist, bool& res);
	void GetParamList(const QString& file, const QString& sec, QStringList& parlist);

	/**
		Запрос значения параметра.
		 file (входной параметр) - полный или относительный путь к ini файлу;
		 sec(входной параметр) - имя секции;
		 par(входной параметр) - имя параметра в секции;
		 val(выходной параметр) - значение параметра;
		 res (выходной параметр) - результат запроса.
	*/
	void GetValue(const QString& file, const QString& sec, const QString& par, QString& val, int& res);
	void GetValue(const QString& file, const QString& sec, const QString& par, QString& val, bool& res);
	void GetValue(const QString& file, const QString& sec, const QString& par, QString& val);

	/**
		Установка значения параметра.
		 file (входной параметр) - полный или относительный путь к ini файлу;
		 sec(входной параметр) - имя секции в ini файле;
		 par(входной параметр) - имя параметра в секции;
		 val(входной параметр) - значение параметра;
		 res (выходной параметр) - результат выполнения.
	*/
	void SetValue(const QString& file, const QString& sec, const QString& par, const QString& val, int& res);
	void SetValue(const QString& file, const QString& sec, const QString& par, const QString& val, bool& res);
	void SetValue(const QString& file, const QString& sec, const QString& par, const QString& val);

	/**
		Удаление параметра.
		 file (входной параметр) - полный или относительный путь к ini файлу;
		 sec(входной параметр) - имя секции в ini файле;
		 par(входной параметр) - имя параметра в секции;
		 res (выходной параметр) - результат удаления параметра.
	*/
	void DelParam(const QString& file, const QString& sec, const QString& par, int& res);
	void DelParam(const QString& file, const QString& sec, const QString& par, bool& res);
	void DelParam(const QString& file, const QString& sec, const QString& par);

signals:
	/**
		Сигнал установки ошибки
		 num - код ошибки;
		 source - источник ошибки;
		 params - параметры ошибки.
	*/
	void SetCurrentError(const int& num, const QString& source, const QStringList& params);

	/**
		Сигнал загрузки файла
		 file - имя загруженного файла
	*/
	void IniFileLoaded(const QString& file);

	/**
		Сигнал сохранения файла
		 file - имя сохраненного файла
	*/
	void IniFileSaved(const QString& file);

	/**
		Сигнал сохранения всех файлов
	*/
	void AllIniFilesSaved();

	/**
		Сигнал выгрузки файла
		 file - имя выгруженного файла
	*/
	void IniFileUnloaded(const QString& file);

	/**
		Сигнал выгрузки всех файлов
	*/
	void AllIniFilesUnloaded();

};

#endif // COREINI_H
